package com.liyu.rabbit;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

/**
 * 作者: 李誉
 * 时间: 2022-01-13 19:49
 * 描述: 消息生产者
 */
public class Producer {

    // 队列名称
    public static final String QUEUE_NAME = "hello";
    public static final String EX_NAME = "hello_ex";

    // 发送消息
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1、创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 2、设置连接信息
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");


        try (
            // 3、创建连接
            Connection connection = connectionFactory.newConnection();
            // 4、获得信道
            Channel channel = connection.createChannel();
        ){

            /*
             * 5、创建一个队列
             * 参数：
             *  queue：队列名称
             *  durable：是否持久化(默认存储在内存中)
             *  exclusive：是否是一个独占队列（一般等于true的话用于一个队列只能有一个消费者来消费的场景）
             *          有两个作用，一：当连接关闭时connection.close()该队列是否会自动删除；二：该队列是否是私有的private，
             *          如果不是排外的，可以使用两个消费者都访问同一个队列，没有任何问题，如果是排外的，会对当前队列加锁，其他通
             *          道channel是不能访问的，如果强制访问会报异常
             * autoDelete：是否自动删除，当最后一个消费者断开连接之后队列是否自动被删除
             * arguments：其他参数
             */
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);


            // 6、初始化发送的消息
            String msg = "Hello world!";

            // 7、发送消息
            channel.basicPublish("", QUEUE_NAME, null, msg.getBytes(StandardCharsets.UTF_8));

            System.out.println("消息发送成功");

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
